package RD;
import java.util.Random;
import java.util.Scanner;

public class PasswordManager {
    private static String encryptPassword(String password) {
        // 将每个字符的 ASCII 码加上它在字符串中的位置（从 1 开始）和偏移值 3
    	//66
        StringBuilder encryptedPassword = new StringBuilder();
        for (int i = 0; i < password.length(); i++) {
            char encryptedChar = (char) (password.charAt(i) + i + 1 + 3);
            encryptedPassword.append(encryptedChar);
        }

        // 将字符串的第一位和最后一位调换顺序
        encryptedPassword.setCharAt(0, encryptedPassword.charAt(encryptedPassword.length() - 1));
        encryptedPassword.setCharAt(encryptedPassword.length() - 1, password.charAt(0));

        // 将字符串反转
        return encryptedPassword.reverse().toString();
    }

    private static String decryptPassword(String encryptedPassword) {
        // 将字符串反转
        StringBuilder decryptedPassword = new StringBuilder(encryptedPassword).reverse();

        // 将字符串的第一位和最后一位调换顺序
        decryptedPassword.setCharAt(encryptedPassword.length() - 1, decryptedPassword.charAt(0));
        decryptedPassword.setCharAt(0, encryptedPassword.charAt(encryptedPassword.length() - 1));

        // 将每个字符的 ASCII 码减去它在字符串中的位置（从 1 开始）和偏移值 3
        StringBuilder password = new StringBuilder();
        for (int i = 0; i < decryptedPassword.length(); i++) {
            char decryptedChar = (char) (decryptedPassword.charAt(i) - i - 1 - 3);
            password.append(decryptedChar);
        }

        return password.toString();
    }

    private static String checkPasswordStrength(String password) {
        // 弱强度：密码长度小于 8 个字符，或者长度大于等于 8 个字符但只有一种字符类型（数字或字母）
        if (password.length() < 8 || password.matches("\\d+") || password.matches("[a-zA-Z]+")) {
            return "弱强度";
        }

        // 中强度：密码长度大于等于 8 个字符，并且包含至少一个数字和一个字母（可以是大小写）
        if (password.length() >= 8 && password.matches(".*\\d+.*") && password.matches(".*[a-zA-Z]+.*")) {
            return "中强度";
        }

        // 高强度：密码长度大于等于 8 个字符，并且包含至少一个数字、一个小写字母和一个大写字母
        if (password.length() >= 8 && password.matches(".*\\d+.*") && password.matches(".*[a-z]+.*") && password.matches(".*[A-Z]+.*")) {
            return "高强度";
        }

        return "未知强度";
    }

    private static String generatePassword(int length) {
        String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder password = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            char c = chars.charAt(random.nextInt(chars.length()));
            password.append(c);
        }
        return password.toString();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //我修改的内容
        while (true) {
            System.out.println("==============================");
            System.out.println("欢迎使用密码管理系统");
            System.out.println("==============================");
            System.out.println("请选择操作：");
            System.out.println("1. 加密");
            System.out.println("2. 解密");
            System.out.println("3. 判断密码强度");
            System.out.println("4. 密码生成");
            System.out.println("5. 退出");

            System.out.print("请输入选项序号：");
            String choice = scanner.nextLine();
            System.out.println();

            switch (choice) {
                case "1":
                    System.out.print("请输入要加密的密码：");
                    String password = scanner.nextLine();
                    String encryptedPassword = encryptPassword(password);
                    System.out.println("加密后的结果是：" + encryptedPassword);
                    break;

                case "2":
                    System.out.print("请输入要解密的密码：");
                    String encryptedPassword2 = scanner.nextLine();
                    String decryptedPassword = decryptPassword(encryptedPassword2);
                    System.out.println("解密后的结果是：" + decryptedPassword);
                    break;

                case "3":
                    System.out.print("请输入要判断强度的密码：");
                    String password2 = scanner.nextLine();
                    String strength = checkPasswordStrength(password2);
                    System.out.println("密码强度为：" + strength);
                    break;

                case "4":
                    System.out.print("请输入要生成的密码长度：");
                    int length = scanner.nextInt();
                    scanner.nextLine();
                    String generatedPassword = generatePassword(length);
                    System.out.println("生成的密码是：" + generatedPassword);
                    break;

                case "5":
                    System.exit(0);
                    break;

                default:
                    System.out.println("无效的选项，请重新输入。");
            }
        }
    }
}
